#include "music_json.h"

music_json::music_json(QObject *parent)
    : QObject(parent)
{
//     网络访问对象
    mNetAccessManager = new QNetworkAccessManager(this);
//     接收数据信号
    connect(mNetAccessManager , &QNetworkAccessManager::finished , this , &music_json::Network_finished);
}
void music_json:: on_pushButton_clicked(const QString &url)
{
    mNetAccessManager->get(QNetworkRequest(url));
}
void music_json::Network_finished(QNetworkReply *reply)
{
    // 请求头   读取相应码
    int start_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt();

    qDebug() << start_code;

    //
    // 读取数据
    QByteArray data = reply->readAll();
    QByteArray bytearr = QString(data).toUtf8();
    qDebug() << bytearr.data();
    handle_data(bytearr.data());
}
bool music_json::parseLyricJson(const QByteArray &jsonData)
{
    clear();
    qDebug() << "已清空容器";

    QJsonParseError parseError;
    QJsonDocument doc = QJsonDocument::fromJson(jsonData, &parseError);
    qDebug() << "JSON解析完成，错误码:" << parseError.error;

    if (parseError.error != QJsonParseError::NoError) {
        qWarning() << "JSON解析错误:" << parseError.errorString();
        return false;
    }

    // 直接处理解析后的JSON对象，避免递归调用
    QJsonObject rootObj = doc.object();

    // 检查响应码
    if (rootObj.contains("code") && rootObj["code"].toInt() != 200) {
        qWarning() << "API返回错误码:" << rootObj["code"].toInt();
        return false;
    }

    // 检查lrc对象是否存在
    if (!rootObj.contains("lrc") || !rootObj["lrc"].isObject()) {
        qWarning() << "JSON中未找到lrc对象";
        return false;
    }

    QJsonObject lrcObj = rootObj["lrc"].toObject();

    // 获取歌词文本
    if (!lrcObj.contains("lyric") || !lrcObj["lyric"].isString()) {
        qWarning() << "未找到歌词文本";
        return false;
    }

    QString lyricText = lrcObj["lyric"].toString();

    // 如果歌词为空
    if (lyricText.isEmpty()) {
        qWarning() << "歌词文本为空";
        return false;
    }

    qDebug() << "获取到歌词文本，长度:" << lyricText.length();

    // 解析歌词文本
    return parseLyricText(lyricText);
}
bool music_json::parseLyricText(const QString &lyricText)
{
    qDebug() << "开始解析歌词文本";

    // 按行分割歌词
    QStringList lines = lyricText.split('\n', Qt::SkipEmptyParts);
    qDebug() << "歌词文本行数:" << lines.size();

    int parsedCount = 0;
    for (const QString &line : lines) {
        if (parseLyricLine(line)) {
            parsedCount++;
        }
    }

    qDebug() << "成功解析" << parsedCount << "行歌词";
    qDebug() << "最终容器状态 - 位置数:" << m_positions.size()
             << "歌词数:" << m_lyrics.size();

    return hasLyrics();
}
bool music_json::parseLyricJson(const QString &jsonString)
{
    // 直接将QString转换为QByteArray，然后调用另一个重载
    return parseLyricJson(jsonString.toUtf8());
}

bool music_json::parseLyricLine(const QString &line)
{
    // 使用正则表达式匹配时间标签和歌词内容
    static QRegularExpression regex(R"(\[(\d{2}):(\d{2})\.(\d{2,3})\](.*))");

    QRegularExpressionMatch match = regex.match(line);

    if (match.hasMatch()) {
        QString minutes = match.captured(1);
        QString seconds = match.captured(2);
        QString milliseconds = match.captured(3);
        QString lyricText = match.captured(4).trimmed();

        // 转换为毫秒
        int timeMs = timeStringToMilliseconds(minutes, seconds, milliseconds);

        if (timeMs >= 0 && !lyricText.isEmpty()) {
            m_positions.append(timeMs);
            m_lyrics.append(lyricText);
            return true;
        }
    }

    return false;
}
int music_json::timeStringToMilliseconds(const QString &minutesStr, const QString &secondsStr, const QString &millisecondsStr)
{
    bool ok;

    int minutes = minutesStr.toInt(&ok);
    if (!ok || minutes < 0) {
        qWarning() << "Invalid minutes:" << minutesStr;
        return -1;
    }

    int seconds = secondsStr.toInt(&ok);
    if (!ok || seconds < 0 || seconds >= 60) {
        qWarning() << "Invalid seconds:" << secondsStr;
        return -1;
    }

    int milliseconds = millisecondsStr.toInt(&ok);
    if (!ok || milliseconds < 0) {
        qWarning() << "Invalid milliseconds:" << millisecondsStr;
        return -1;
    }

    // 处理毫秒位数，可能是2位或3位
    if (millisecondsStr.length() == 2) {
        milliseconds *= 10; // 如果是2位，补成3位
    } else if (millisecondsStr.length() != 3) {
        qWarning() << "Unexpected milliseconds length:" << millisecondsStr.length();
        return -1;
    }

    // 确保毫秒不超过999
    if (milliseconds > 999) {
        milliseconds = 999;
    }

    return (minutes * 60 + seconds) * 1000 + milliseconds;
}

void music_json::clear()
{
    m_positions.clear();
    m_lyrics.clear();
}
void music_json::handle_data(const QByteArray &bytearr)
{
    qDebug() << "=== 开始处理歌词数据 ===";

    if (bytearr.isEmpty()) {
        qWarning() << "接收到的歌词数据为空";
        emit emit_data(QList<int>(), QStringList());
        return;
    }

    qDebug() << "数据大小:" << bytearr.size() << "字节";

    // 检查是否是有效的JSON（简单检查）
    if (!bytearr.trimmed().startsWith('{')) {
        qWarning() << "数据不是有效的JSON格式";
        emit emit_data(QList<int>(), QStringList());
        return;
    }

    try {
        // 使用 LyricParser 解析数据
        if (this->parseLyricJson(bytearr)) {
            // 解析成功，获取解析结果
            QList<int> positions = this->getPositions();
            QStringList lyrics = this->getLyrics();

            qDebug() << "歌词解析成功，共" << positions.size() << "行歌词";
            qDebug() << "歌词" << lyrics ;
            // 发送信号，传递解析结果
            emit emit_data(positions, lyrics);

        } else {
            qWarning() << "歌词解析失败或无歌词内容";
            emit emit_data(QList<int>(), QStringList());
        }
    } catch (const std::exception& e) {
        qCritical() << "解析过程中发生异常:" << e.what();
        emit emit_data(QList<int>(), QStringList());
    } catch (...) {
        qCritical() << "解析过程中发生未知异常";
        emit emit_data(QList<int>(), QStringList());
    }

    qDebug() << "=== 歌词数据处理完成 ===";
}
